# Banner-API

## Описание
Этот сервис предоставлят возможность показывать баннеры в зависимости от параметров таких как `feature` и `tag`. Также, сервис обеспечивает интерфейс для управления баннерами, их содержанием, тэгами и фичами.  
  
## Архитектура
Архитектура приложения включает в себя два основных слоя: ядро(core) и инфраструктура(infrastructure). Ядро располагается ниже инфраструктуры, поэтому, код ядра может быть вызван из инфраструктуры но не наоборот. Это применимо и ко внутренним компонентам слоев расположенным вертикально. Это также отражено в структуре директорий в `src`.  
Как можно заметить, здесь реализован паттерн Репозиторий. Пакет `repository` содержит интерфейс `IRepository`, который используется в в пакете `application`, который представляет собой основную логику приложения. Пакет `model` содержит структуры представляющие собой баннеры, фичи, тэги и пользователей. Пакет `storage` содержит PostgreSQL коннектор и реализует интерфейс `IRepository`, что позволяет внедрить его в приложение в качестве базы данных. Пакет `controllers` является реализацией API, который содержит логику обработки запросов.  
  
![Arch](materials/arch.jpg)  
  
## Запуск
Развертывание сервиса реализовано с помощью docker-compose. Таким образом, он должен быть установлен перед запуском. Запуск сервиса требует переменные окружения определенные в файле `.env`. Пример всех необходимых переменных представлен в файле `env-example`. Рекомендуется создать файл со всеми переменными в ручную. В случае отсутствия `.env` файла в момент запуска, он будет создан из файла `env-example` автоматически.  
Как видно из файла `env-example`, приложение будет прослуивать трафик на `localhost:8080`, а веб интерфейс `adminer` для управления базой данных PostgreSQL на `localhost:8888`.  
Следующие команды `Makefile` позволяют управлять работой сервиса.  
```sh
# запуск сервиса и затем тестирования
make

# запуск тестирования (полностью провалится если сервис не запущен)
make test

# запуск сервиса
make run

# остановка сервиса
make stop

# остановка сервиса и удаление контейнеров (не удаляет docker volume)
make clean
```
  
## Примеры
Примеры запросов представлены в [коллекции Postman](materials/Banner-API.postman_collection.json)
  